﻿<h1>Go语言101</h1>
<!-- Go Language Blue Book -->

<div>
	<p>
	《Go语言101》是一本着墨于Go语法语义以及运行时相关知识点的编程指导书（Go 1.15就绪）。
	此书旨在尽可能地帮助Go程序员更深更全面地理解Go语言。
	此书也搜集了Go语言和Go编程中的很多细节。
	此书同时适合Go初学者和有一定经验的Go程序员阅读。
	</p>
</div>


<div class="row">
	<div class="col-xs-12 col-sm-7">
		<ul>
		<li>
		English version is <a href="https://go101.org">here</a>.
		</li>
		<li>
		此项目源代码目前托管在<a href="https://github.com/golang101/golang101">Github</a>上。
		你可以将代码拉取到本地并在项目目录下运行<code>go run .</code>命令来启动一个本地服务器来阅读本书以获取更好的阅读体验。
		</li>
		<li>
		本书微信公众号名称为"Go 101"。此公众号将时不时地发表一些Go语言相关的原创短文。各位如果感兴趣，可以搜索关注一下。 
		</li>
		<li>
		本书由<a href="https://gfw.tapirgames.com">老貘</a>历时三年写成。目前本书仍在不断改进和增容中。
		你的赞赏是本书和Go101.org网站不断增容和维护的动力。
		</li>
		</ul>
	</div>

	<div class="col-xs-12 col-sm-5 text-center">
		<img src="res/101-reward-qrcode-8.png" alt="赞赏" style="max-width: 100%; height: auto; width: auto\9;"></img>
	</div>

</div>

<p>
</p>

<div class="alert alert-danger"><small>
	<i>2020/09/06</i>: 本书曾经提到使用append来克隆切片常常比使用make+copy来克隆切片
	高效得多。但是从官方工具链1.15版本开始，官方标准编译器对后者进行了特殊的优化，从而使得后者总是比前者高效。
</small></div>

<div class="alert alert-danger"><small>
	<i>2020/08/13</i>: 更正：<a href="string.html#conversion-optimizations">字符串和字节切片之间的转换的编译器优化</a>一节曾列出
	“一个在映射元素索引语法中被用做键值的从字节切片到字符串的转换（不需复制底层字节）”。实际上此优化只对元素读取索引语法有效。
	目前描述和代码一并得到了更正。
</small></div>

<!--
<div class="alert alert-warning"><small>
	<i>2020/06/02</i>: 将所有的“Go SDK”用词都替换成了“Go工具链”。
</small></div>

<div class="alert alert-warning"><small>
	<i>2020/04/22</i>: <code>runtime.KeepAlive</code>调用对于将一些的<code>unsafe.Pointer</code>非法使变得合法是无助的。因此，<a href="unsafe.html">非类型安全指针</a>一文中的多处进行了调整。请重新阅读此文以获得详情。<i>(在此对此前传播了错误信息而致歉。)</i>
</small></div>

<div class="alert alert-warning"><small>
	<i>2019/10/31</i>:
	<ul>
	<li>
	改正了“删除子切片”例子代码中的<a href="https://github.com/golang101/golang101/commit/b77b9fc3eab480f96abb3bf3d4bc3063f22a4b63#diff-8eb02937949dd308587a57ed66732712">一个错误</a>。
	</li>
	<li>
	更正了“延迟调用的函数值的估值时刻”的<a href="https://github.com/golang101/golang101/commit/facaf82943a5c0d21bec96ce76ad70d60fccdda7">解释</a>。
	</li>
	<li>
	"在正确的位置调用内置<code>recover</code>函数"一文改名为“<a href="panic-and-recover-more.html">详解panic/recover原理</a>”。
	</li>
	</ul>
	
</small></div>

<div class="alert alert-warning"><small>
	<i>2019/10/18</i>: “表达式估值顺序规则”一文中对<a href="evaluation-orders.html#value-assignment">赋值语句中的表达式估值和赋值执行顺序</a>的解释有<a href="https://github.com/golang/go/issues/27821#issuecomment-543611217">不恰当之处</a>。目前采用了一个新的更简单的描述来解释。
</small></div>

<div class="alert alert-warning"><small>
	<i>2019/09/30</i>: 在“非类型安全指针”一文中添加了<a href="unsafe.html#fact-value-address-might-change">一个事实</a><strike>并指出本书在<a href="unsafe.html#pattern-convert-to-uintptr-and-back">使用模式三：将一个非类型安全指针转换为一个uintptr值，然后此uintptr值参与各种算术运算，再将算术运算的结果uintptr值转回非类型安全指针</a>一节中犯了一个严重的错误</strike>。
	<i>（我决定撤回此勘误。）</i>
</small></div>

<div class="alert alert-warning"><small>
	<i>2019/09/25</i>: 本书《在正确的位置调用内置recover函数》一文犯了<a href="panic-and-recover-more.html#recover-order">一个低级错误</a>。
	犯此错误的一节过段时间后将被修订。
</small></div>

<div class="alert alert-warning"><small>
	<i>2019/09/19</i>: 本书加回了“有名类型”和“无名类型”这两个术语，但是它们的含义改变了。现在它们完全等价于“定义类型”和“非定义类型”。
</small></div>

<div class="alert alert-warning"><small>
	<i>2019/04/09</i>: 本书不再使用“别名类型”、“有名类型”和“无名类型”这几个术语。
	“类型别名”仍被使用。
</small></div>

<div class="alert alert-warning"><small>
	<i>2018/12/27</i>: 本书刚修正了一个严重的错误。之前，本书认为一个子切片表达式中的起始下标不能大于基础切片的长度。
	其实这个限制是不存在的。请阅读<a href="container.html#subslice">修正后的章节</a>。
</small></div>
-->

<div>

目录：

<!-- index starts (don't remove) -->

<div id="book-index">

<!-- kindle starts: 1 -->

<ul class="index part">
	<li><a class="index" href="101-about.html">关于Go语言101</a> - 为什么写这本书</li>
	<li><a class="index" href="acknowledgements.html">致谢</a></li>
</ul>

<ul class="index part">
	<li><a class="index" href="introduction.html">Go语言简介</a> - 为什么Go语言值得学习</li>
	<li><a class="index" href="go-toolchain.html">Go官方工具链</a> - 如何编译和运行Go程序</li>
</ul>

<ul class="index part">
<li>
Go编程入门

	<ul class="index chapters">
	<li><a class="index" href="basic-code-elements-introduction.html">程序源代码基本元素介绍</a></li>
	<li><a class="index" href="keywords-and-identifiers.html">关键字和标识符</a></li>
	<li><a class="index" href="basic-types-and-value-literals.html">基本类型和它们的字面量表示</a></li>
	<li><a class="index" href="constants-and-variables.html">常量和变量</a> - 顺便介绍了类型不确定值和类型推断</li>
	<li><a class="index" href="operators.html">运算操作符</a> - 介绍了更多的类型推断规则</li>
	<li><a class="index" href="function-declarations-and-calls.html">函数声明和调用</a></li>
	<li><a class="index" href="packages-and-imports.html">代码包和包引入</a></li>
	<li><a class="index" href="expressions-and-statements.html">表达式、语句和简单语句</a></li>
	<li><a class="index" href="control-flows.html">基本流程控制语法</a></li>
	<li><a class="index" href="control-flows-more.html">协程、延迟函数调用、以及恐慌和恢复</a></li>
	</ul>

</li>
</ul>

<ul class="index part">
<li>
Go类型系统

	<ul class="index chapters">
	<li><a class="index" href="type-system-overview.html">Go类型系统概述</a> - 精通Go编程必读</li>
	<li><a class="index" href="pointer.html">指针</a></li>
	<li><a class="index" href="struct.html">结构体</a></li>
	<li><a class="index" href="value-part.html">值部</a> - 为了更容易和更深刻地理解Go中的各种值</li>
	<li><a class="index" href="container.html">数组、切片和映射</a> - Go中的首要容器类型</li>
	<li><a class="index" href="string.html">字符串</a></li>
	<li><a class="index" href="function.html">函数</a> - 函数类型和函数值，以及变长参数个数函数</li>
	<li><a class="index" href="channel.html">通道</a> - Go特色的并发同步方式</li>
	<li><a class="index" href="method.html">方法</a></li>
	<li><a class="index" href="interface.html">接口</a> - 通过包裹不同具体类型的非接口值来实现反射和多态</li>
	<li><a class="index" href="type-embedding.html">类型内嵌</a> - 不同于继承的类型扩展方式</li>
	<li><a class="index" href="unsafe.html">非类型安全指针</a></li>
	<li><a class="index" href="generic.html">范型</a></li>
	<li><a class="index" href="reflection.html">反射</a> - <code>reflect</code>标准库包中提供的反射支持</li>
	</ul>
</li>
</ul>

<!-- kindle ends: 1 -->

<!-- kindle starts: 2 -->

<ul class="index part">
<li>
一些专题

	<ul class="index chapters">
	<li><a class="index" href="line-break-rules.html">代码断行规则</a></li>
	<li><a class="index" href="defer-more.html">更多关于延迟函数调用的知识点</a></li>
	<li><a class="index" href="panic-and-recover-use-cases.html">一些恐慌/恢复用例</a></li>
	<li><a class="index" href="panic-and-recover-more.html">详解panic/recover原理</a> - 也解释了什么是“函数退出阶段”</li>
	<li><a class="index" href="blocks-and-scopes.html">代码块和标识符作用域</a></li>
	<li><a class="index" href="evaluation-orders.html">表达式估值顺序规则</a></li>
	<li><a class="index" href="value-copy-cost.html">值复制成本</a></li>
	<li><a class="index" href="bounds-check-elimination.html">边界检查消除</a></li>
	</ul>

</li>
</ul>

<ul class="index part">
<li>
并发编程

	<ul class="index chapters">
	<li><a class="index" href="concurrent-synchronization-overview.html">并发同步概述</a></li>
	<li><a class="index" href="channel-use-cases.html">通道用例大全</a></li>
	<li><a class="index" href="channel-closing.html">如何优雅地关闭通道</a></li>
	<li><a class="index" href="concurrent-synchronization-more.html">其它并发同步技术</a> - 如何使用<code>sync</code>标准库包</li>
	<li><a class="index" href="concurrent-atomic-operation.html">原子操作</a> - 如何使用<code>sync/atomic</code>标准库包</li>
	<li><a class="index" href="memory-model.html">Go中的内存顺序保证</a></li>
	<li><a class="index" href="concurrent-common-mistakes.html">一些常见并发编程错误</a></li>
	</ul>

</li>
</ul>


<ul class="index part">
<li>
内存相关

	<ul class="index chapters">
	<li><a class="index" href="memory-block.html">内存块</a></li>
	<li><a class="index" href="memory-layout.html">关于Go值的内存布局</a></li>
	<li><a class="index" href="memory-leaking.html">一些可能的内存泄漏场景</a></li>
	</ul>

</li>
</ul>

<ul class="index part">
<li>
一些总结

	<ul class="index chapters">
	<li><a class="index" href="summaries.html">一些简单的总结</a></li>
	<li><a class="index" href="nil.html">关于Go中的<code>nil</code></a></li>
	<li><a class="index" href="value-conversions-assignments-and-comparisons.html">类型转换、赋值和值比较规则大全</a></li>
	<li><a class="index" href="exceptions.html">Go中的一些语法/语义例外</a></li>
	<!-- (to remove) for printing
	<li><a class="index" href="details.html">Go细节101</a></li>
	<li><a class="index" href="unofficial-faq.html">Go问答101</a></li>
	<li><a class="index" href="tips.html">Go技巧101</a></li>
	(to remove) -->
	</ul>

</li>
</ul>

<!-- kindle ends: 2 -->

<!-- kindle starts: 0 -->

<ul class="index part">
<li><a class="index" href="more.html">更多关于Go的知识</a></li>
</ul>
</div>

<!-- kindle ends: 0 -->

<!-- index ends (don't remove) -->

</div>
